package org.dxy.domain.model.aggregate;

import org.dxy.types.enums.EquipmentStatusEnum;
import org.dxy.domain.command.equipment.*;
import org.dxy.domain.event.equipment.*;
import org.dxy.domain.model.aggregate.impl.EquipmentAggRoot;
import org.dxy.domain.model.valobj.equipment.EquipmentId;

/**
 * @description: 设备聚合根接口
 * @author: dxy
 * @createTime: 2025/6/5 23:55
 */
public interface Equipment extends AggregateRoot {


    EquipmentId getEquipmentId();

    EquipmentStatusEnum getStatus();

    Long getCurrentWorkOrderId();

    Long getCurrentProcessStepId();

    // === 静态工厂方法 ===
    /**
     * 注册设备
     * @param equipmentId 设备ID
     * @param command 注册设备命令
     * @return 设备聚合根实例
     */
    static Equipment register(Long equipmentId, RegisterEquipmentCommand command) {
        return EquipmentAggRoot.register(equipmentId, command);
    }

    // === 业务方法 ===
    /**
     * 设备分配某个工单的某个工艺步骤任务
     * @param workOrderId 工单ID
     * @param processStepId 工艺步骤ID
     */
    void assignProcess(Long workOrderId, Long processStepId);

    /**
     * 设备执行某个工单步骤后上报结果
     */
    void reportExecutionResult(ReportProcessResultCommand resultCommand);

    /**
     * 激活设备
     * @param command 激活设备命令
     */
    void activate(ActivateEquipmentCommand command);



    /**
     * 配置设备能力
     * @param command 配置设备能力命令
     */
    void configureCapabilities(ConfigureEquipmentCapabilityCommand command);

    /**
     * 停用设备
     * @param command 设备停用命令
     * @return 设备停用事件
     */
    void deactivate(DeactivateEquipmentCommand command);

    /**
     * 分配工艺步骤任务给设备
     * @param command 分配任务命令
     */
    void assignTask(AssignProcessToEquipmentCommand command);

    /**
     * 设备完成任务处理
     * @param command 完成任务命令
     */
    void completeProcess(CompleteProcessCommand command);

    /**
     * 设备开始执行任务
     * @param command 启动任务命令
     * @return 任务开始事件
     */
    ProcessStartedEvent startProcess(StartProcessCommand command);

    /**
     * 设备上报任务处理结果
     * @param command 上报结果命令
     * @return 结果上报事件
     */
    ResultReportedEvent reportResult(ReportProcessResultCommand command);

    /**
     * 处理设备任务失败逻辑
     * @param command 失败处理命令
     * @return 失败事件
     */
    ProcessFailedEvent failProcess(FailProcessCommand command);

    /**
     * 检测并标记设备为故障状态
     * @param command 故障检测命令
     * @return 故障检测事件
     */
    EquipmentFaultDetectedEvent detectFault(DetectEquipmentFaultCommand command);

    /**
     * 执行设备故障恢复操作
     * @param command 恢复设备命令
     * @return 设备恢复事件
     */
    EquipmentRecoveredEvent recover(RecoverEquipmentCommand command);

    /**
     * 开始设备维护
     * @param command 开始维护命令
     * @return 维护开始事件
     */
    EquipmentMaintenanceStartedEvent startMaintenance(StartEquipmentMaintenanceCommand command);

    /**
     * 完成设备维护
     * @param command 完成维护命令
     */
    void completeMaintenance(CompleteEquipmentMaintenanceCommand command);

    /**
     * 设备检验通过
     * @param command 检验通过命令
     * @return 检验通过事件
     */
    EquipmentInspectionPassedEvent passInspection(PassEquipmentInspectionCommand command);

    /**
     * 设备检验失败
     * @param command 检验失败命令
     * @return 检验失败事件
     */
    EquipmentInspectionFailedEvent failInspection(FailEquipmentInspectionCommand command);

    /**
     * 设备退役
     * @param command 设备退役命令
     * @return 设备退役事件
     */
    EquipmentRetiredEvent retire(RetireEquipmentCommand command);

    /**
     * 删除设备
     * @param command 删除设备命令
     * @return 设备删除事件
     */
    EquipmentDeletedEvent delete(DeleteEquipmentCommand command);


    void reassignTaskDueToFailure(ReassignTaskDueToFailureCommand command);
}

